/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package graf;

import java.util.ArrayList;

/**
 *
 * @author sufka
 */
public class DuParyAlgorytm implements Pokrycie {

    private Graf graf;

    public DuParyAlgorytm(Graf graf) {
        this.graf = graf;
    }

    public ArrayList<Sciezka> tworzPokrycie() {
        ArrayList<Sciezka> zbiorSciezek = new ArrayList<Sciezka>();


        for (Wierzcholek w : graf.getWierzcholki()) {
            ArrayList<Wierzcholek> listaUniqW = new ArrayList<Wierzcholek>();
            ArrayList<WierzcholekPlusPlus> listaUniqK = new ArrayList<WierzcholekPlusPlus>();
            for (DefUse duw : w.getDefUse()) {
                if (duw instanceof Definicja) {
                    for (Wierzcholek ww : graf.getWierzcholki()) {
                        if (!listaUniqW.contains(ww)) {
                            for (DefUse duww : ww.getDefUse()) {
                                if (duww instanceof Uzycie && duw.getZmienna().equals(duww.getZmienna())) {
                                    Sciezka s = new Sciezka();
                                    s.dodajNaKoniec(w);
                                    Wierzcholek tmpw = new Wierzcholek();
                                    tmpw.setNumer(-1);
                                    s.dodajNaKoniec(tmpw);
                                    s.dodajNaKoniec(ww);
                                    zbiorSciezek.add(s);
                                    listaUniqW.add(ww);
                                }
                            }
                        }
                        for (WierzcholekPlusPlus wpp : ww.getSasiedzi()) {
                            if (!listaUniqK.contains(wpp)) {
                                for (DefUse duww : wpp.getDefUse()) {
                                    if (duww instanceof Uzycie && duw.getZmienna().equals(duww.getZmienna())) {
                                        Sciezka s = new Sciezka();
                                        s.dodajNaKoniec(w);
                                        Wierzcholek tmpw = new Wierzcholek();
                                        tmpw.setNumer(-1);
                                        s.dodajNaKoniec(tmpw);
                                        s.dodajNaKoniec(ww);
                                        s.dodajNaKoniec(wpp.getWierzcholek());
                                        zbiorSciezek.add(s);
                                        listaUniqK.add(wpp);
                                    }
                                }
                            }
                        }
                    }
                }
            }
            for (WierzcholekPlusPlus wppp : w.getSasiedzi()) {
                ArrayList<Wierzcholek> lUW = new ArrayList<Wierzcholek>();
                ArrayList<WierzcholekPlusPlus> lUK = new ArrayList<WierzcholekPlusPlus>();
                for (DefUse duw : wppp.getDefUse()) {
                    if (duw instanceof Definicja) {
                        for (Wierzcholek ww : graf.getWierzcholki()) {
                            if (!lUW.contains(ww)) {
                                for (DefUse duww : ww.getDefUse()) {
                                    if (duww instanceof Uzycie && duw.getZmienna().equals(duww.getZmienna())) {
                                        Sciezka s = new Sciezka();
                                        s.dodajNaKoniec(w);
                                        s.dodajNaKoniec(wppp.getWierzcholek());
                                        Wierzcholek tmpw = new Wierzcholek();
                                        tmpw.setNumer(-1);
                                        s.dodajNaKoniec(tmpw);
                                        s.dodajNaKoniec(ww);
                                        zbiorSciezek.add(s);
                                        lUW.add(ww);
                                    }
                                }
                            }
                            for (WierzcholekPlusPlus wpp : ww.getSasiedzi()) {
                                if (!lUK.contains(wpp)) {
                                    for (DefUse duww : wpp.getDefUse()) {
                                        if (duww instanceof Uzycie && duw.getZmienna().equals(duww.getZmienna())) {
                                            Sciezka s = new Sciezka();
                                            s.dodajNaKoniec(w);
                                            s.dodajNaKoniec(wppp.getWierzcholek());
                                            Wierzcholek tmpw = new Wierzcholek();
                                            tmpw.setNumer(-1);
                                            s.dodajNaKoniec(tmpw);
                                            s.dodajNaKoniec(ww);
                                            s.dodajNaKoniec(wpp.getWierzcholek());
                                            zbiorSciezek.add(s);
                                            lUK.add(wpp);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        return zbiorSciezek;
    }
}
